package com.njupt.Array;

import java.util.ArrayList;
import java.util.List;

/**暴力解法
 * 给定一个含有 n 个正整数的数组和一个正整数 target 。
 * 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
 *
 * 收获 for循环结束之后，执行的是for循环下面的第一条语句
 */
public class MinSubArrayLen {


    /**
     * 滑动窗口法
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen1(int target, int[] nums) {
        int minLen = nums.length+1;
        int left = 0;
        int minLeft = -1;
        int minRight = -1;
        int sum = 0;

        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while(sum>=target){
                if(right-left+1 < minLen){
                    minLen = right-left +1;
                    minLeft = left;
                    minRight = right;
                }
                sum -= nums[left];
                left++;
            }
        }
        return (minLeft == -1 || minRight == -1) ?0:(minRight-minLeft +1);


    }

    /**
     *
     *
     * 暴力法
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen(int target, int[] nums) {
        List<Integer> results = new ArrayList<>();
        int sum=nums[0],len=1;
        if(nums.length==1 && sum>=target){
            return 1;
        }
        for (int i = 0; i < nums.length-1 ; i++) {
            sum = nums[i];
            len = 1;
            if(sum>=target){
                results.add(len);
            }
            for (int j = i+1; j <nums.length ; j++) {
                sum += nums[j]; len++;
                if(sum>=target){
                    results.add(len);
                }
            }
        }

        if(nums[nums.length-1]>=target){
            return 1;
        }
        if(results.size()==0){
            return 0;
        }
        int min = results.get(0);
        for (Integer num: results
             ) {
            if(num<min){
                min = num;
            }
        }
        return min;
    }

    public static void main(String[] args) {
        MinSubArrayLen test = new MinSubArrayLen();
        int[] nums = {2,3,1,2,4,3};
        int min = test.minSubArrayLen1(7, nums);
        System.out.println(min);
    }
}
